home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / gnu / oleo_src.lha / src / sc.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  6KB  |  269 lines

  1. /*    Copyright (C) 1990 Free Software Foundation, Inc.
  2.  
  3. This file is part of Oleo, the GNU Spreadsheet.
  4.  
  5. Oleo is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 1, or (at your option)
  8. any later version.
  9.  
  10. Oleo is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with Oleo; see the file COPYING.  If not, write to
  17. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #include "funcdef.h"
  20.  
  21. #include <stdio.h>
  22. #include <ctype.h>
  23. #include "sysdef.h"
  24.  
  25. #include "global.h"
  26. #include "cell.h"
  27.  
  28. extern long astol EXT1(char **);
  29.  
  30. extern void set_width EXT2(CELLREF, unsigned short);
  31. extern unsigned short next_widths EXT2(CELLREF *,CELLREF *);
  32.  
  33. extern char *cell_name EXT2(CELLREF, CELLREF);
  34. extern char *range_name EXT1(struct rng *);
  35.  
  36. extern CELLREF highest_row EXT0();
  37. extern CELLREF highest_col EXT0();
  38.  
  39. extern void read_usr_fmt EXT1(char *);
  40. extern void write_usr_fmt EXT1(FILE *);
  41.  
  42. extern void read_options EXT1(char *);
  43. extern void write_options EXT1(FILE *);
  44.  
  45. extern void clear_spreadsheet EXT0();
  46.  
  47. extern char *new_var_value EXT3(char *, int, char *);
  48.  
  49. extern char *read_new_value EXT4(CELLREF, CELLREF, char *, char *);
  50.  
  51. extern void push_cell EXT2(CELLREF, CELLREF);
  52.  
  53. extern char *bname[];
  54. extern default_jst;
  55. extern default_fmt;
  56. extern default_lock;
  57. extern unsigned short default_width;
  58.  
  59. extern struct rng all_rng;
  60.  
  61. /* This reads/writes a subset of the SC public-domain spreadsheet's
  62.    file-format.  Note that since SC has no way of encoding some information
  63.    about a cell, writing a spread out in SC format, then reading it back in
  64.    will result in the loss of some information (most important:  cell formats)
  65.  */
  66.  
  67. static int
  68. get_range FUN2(char **,pp, struct rng *,rp)
  69. {
  70.     int byte;
  71.     char *p;
  72.     struct var *v;
  73.     extern struct var *find_var();
  74.     extern unsigned char parse_cell_or_range EXT2(char **,struct rng *);
  75.  
  76.     while(isspace(**pp))
  77.         (*pp)++;
  78.     byte=parse_cell_or_range(pp,rp);
  79.     if(byte)
  80.         return 0;
  81.     for(p= *pp;*p && !isspace(*p);p++)
  82.         ;
  83.     v=find_var(*pp,p-*pp);
  84.     if(!v)
  85.         return 1;
  86.     *pp=p;
  87.     *rp=v->v_rng;
  88.     return 0;
  89. }
  90.  
  91. void
  92. sc_read_file FUN2(FILE *,fp, int,ismerge)
  93. {
  94.     char buf[2048];
  95.     int lineno;
  96.     char *ptr;
  97.     int n;
  98.     struct rng rng;
  99.  
  100.     lineno=0;
  101.     if(!ismerge)
  102.         clear_spreadsheet();
  103.     while(fgets(buf,sizeof(buf),fp)) {
  104.         lineno++;
  105.         if(lineno%50==0)
  106.             info_msg("Line %d",lineno);
  107.         if(buf[0]=='#' || buf[0]=='\n')
  108.             continue;
  109.         if(!strncmp(buf,"set ",4)) {
  110.             /* ... */
  111.         } else if(!strncmp(buf,"format ",7)) {
  112.             ptr=buf+7;
  113.             if(get_range(&ptr,&rng))
  114.                 continue;
  115.             n=astol(&ptr);
  116.             set_width(rng.lc,n);
  117.         } else if(!strncmp(buf,"hide ",5)) {
  118.             ptr=buf+5;
  119.             if(get_range(&ptr,&rng))
  120.                 continue;
  121.             set_width(rng.lc,0);
  122.         } else if(!strncmp(buf,"mdir ",5)) {
  123.             /* ... */
  124.         } else if(!strncmp(buf,"define ",7)) {
  125.             char *eptr;
  126.  
  127.             ptr=buf+7;
  128.             while(isspace(*ptr))
  129.                 ptr++;
  130.             if(*ptr!='"') {
  131.                 error_msg("Line %d: No starting \" in define",lineno);
  132.                 continue;
  133.             }
  134.             ptr++;
  135.             for(eptr=ptr; *eptr && *eptr!='"';eptr++)
  136.                 ;
  137.             if(!*eptr) {
  138.                 error_msg("Line %d: No starting \" in define",lineno);
  139.                 continue;
  140.             }
  141.             ptr=new_var_value(ptr,eptr-ptr,eptr+1);
  142.             if(ptr)
  143.                 error_msg("Line %d: %s",ptr);
  144.         } else if(!strncmp(buf,"leftstring ",11) ||
  145.               !strncmp(buf,"rightstring ",12)) {
  146.             CELL *cp;
  147.  
  148.             ptr=buf+11;
  149.             if(get_range(&ptr,&rng))
  150.                 continue;
  151.             while(isspace(*ptr))
  152.                 ptr++;
  153.             if(*ptr=='=')
  154.                 ptr++;
  155.             new_value(rng.lr,rng.lc,ptr);
  156.             cp=find_cell(rng.lr,rng.lc);
  157.             if(buf[0]=='l')
  158.                 SET_JST(cp,JST_LFT);
  159.             else
  160.                 SET_JST(cp,JST_RGT);
  161.  
  162.         } else if(!strncmp(buf,"let ",4)) {
  163.             ptr=buf+4;
  164.             if(get_range(&ptr,&rng))
  165.                 continue;
  166.             while(isspace(*ptr))
  167.                 ptr++;
  168.             if(*ptr=='=')
  169.                 ptr++;
  170.             new_value(rng.lr,rng.lc,ptr);
  171.         } else
  172.             error_msg("Line %d: Can't parse %s",lineno,buf);
  173.     }
  174.     recenter_all_win();
  175. }
  176.  
  177. static FILE *sc_fp;
  178. static struct rng *sc_rng;
  179. static void
  180. sc_write_var FUN2(char *,name, struct var *,var)
  181. {
  182.     if(var->var_flags==VAR_UNDEF && (!var->var_ref_fm || var->var_ref_fm->refs_used==0))
  183.         return;
  184.     switch(var->var_flags) {
  185.     case VAR_UNDEF:
  186.         break;
  187.     case VAR_CELL:
  188.         if(var->v_rng.lr>=sc_rng->lr && var->v_rng.lr<=sc_rng->hr && var->v_rng.lc>=sc_rng->lc && var->v_rng.lc<=sc_rng->hc)
  189.             (void)fprintf(sc_fp,"define \"%s\" %s\n",var->var_name,cell_name(var->v_rng.lr,var->v_rng.lc));
  190.         break;
  191.     case VAR_RANGE:
  192.         if(var->v_rng.lr<sc_rng->lr || var->v_rng.hr>sc_rng->hr || var->v_rng.lc<sc_rng->lc || var->v_rng.hc>sc_rng->hc)
  193.             break;
  194.  
  195.         (void)fprintf(sc_fp,"define \"%s\" %s\n",var->var_name,range_name(&(var->v_rng)));
  196.         break;
  197. #ifdef TEST
  198.     default:
  199.         panic("Unknown var type %d",var->var_flags);
  200.         break;
  201. #endif
  202.     }
  203. }
  204.     
  205. void
  206. sc_write_file FUN2(FILE *,fp, struct rng *,rng)
  207. {
  208.     unsigned short w;
  209.     CELLREF r,c;
  210.     CELLREF rr;
  211.     /* struct var *var; */
  212.     CELL *cp;
  213.     char *ptr;
  214.     extern void for_all_vars();
  215.  
  216.     if(!rng)
  217.         rng= &all_rng;
  218.  
  219.     (void)fprintf(fp,"# This file was created by Oleo, for use by the Spreadsheet Calculator\n");
  220.     (void)fprintf(fp,"# You probably don't want to edit it.\n\n");
  221.  
  222.     (void)next_widths((CELLREF *)0,(CELLREF *)0);
  223.     while(w=next_widths(&r,&c)) {
  224.         if(c<rng->lc || r>rng->hc)
  225.             continue;
  226.         if(r<rng->lc)
  227.             r=rng->lc;
  228.         if(c>rng->hc)
  229.             c=rng->hc;
  230.         rr=r;
  231.         do
  232.             fprintf(fp,"format %s %d ???\n",cell_name(rr,MIN_ROW),w);
  233.         while (rr++!=c);
  234.     }
  235.     sc_fp=fp;
  236.     sc_rng=rng;
  237.     for_all_vars(sc_write_var);
  238.     find_cells_in_range(rng);
  239.     while(cp=next_row_col_in_range(&r,&c)) {
  240.         switch(GET_TYP(cp)) {
  241.         case TYP_STR:
  242.             if((GET_JST(cp)==JST_DEF && default_jst==JST_RGT) || GET_JST(cp)==JST_RGT)
  243.                 ptr="right";
  244.             else ptr="left";
  245.             fprintf(fp,"%sstring %s = %s\n",ptr,cell_name(r,c),decomp(r,c,cp));
  246.             decomp_free();
  247.             break;
  248.         case 0:
  249.             break;
  250.         default:
  251.             fprintf(fp,"let %s = %s\n",cell_name(r,c),decomp(r,c,cp));
  252.             decomp_free();
  253.             break;
  254.         }
  255.     }
  256. }
  257.  
  258. int
  259. sc_set_options FUN2(int,set_opt, char *,option)
  260. {
  261.     return -1;
  262. }
  263.  
  264. void
  265. sc_show_options FUN0()
  266. {
  267.     text_line("File format: sc  (Public domain spreadsheet calculator)");
  268. }
  269.